home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Files; (* V#144 *)⓪ (*$Y+,R-*)⓪ ⓪ (*⓪"22.01.88 TT Get/SetDateTime korrigiert, Close/Remove: A3 richtig nach call⓪"15.05.88 TT Bei Open/Create ist 'appendSeqTxt' auf Units erlaubt;⓪0In checkUnit hatt 'res' nun immer definierten Wert.⓪"03.07.88 TT @CheckError meldet Fehler und liefert FALSE, wenn 'f' in⓪0ErrField zeigt.⓪"01.09.88 TT Sys-Funktionen werden nicht autom. bei unterstem Level-Ende⓪0abgemeldet.⓪"25.10.88 TT CatchRemoval-Aufruf, Files des untersten Levels werden auch⓪0geschlossen.⓪"04.08.89 TT Kein 'del'-Aufruf mehr in Open; Datenpuffer f. 'readSeqTxt'⓪"05.09.88 TT Get/SetDateTime fragen keinen Fehler mehr ab, weil TOS < 1.4⓪0undefinierte Werte liefert⓪"31.01.90 TT unitOpen überschrieb die Ausgaberoutine, was bei Ausgabe⓪0auf eine Unit zu einem JMP ins Ungewisse führte (es lag⓪0daran, daß der 'console'-Move mit .L statt .W gemacht wurde).⓪"16.07.90 TT Bei Close() nach Open() wird das Datei-Datum aktualisiert.⓪"15.09.90 TT Der Dateiname kann nun 139 Zeichen lang sein.⓪"31.01.91 TT Open/Create geht nun auch mit Umlauten im Namen, da die⓪0Umlaute nicht mehr von Klein nach Groß gewandelt werden.⓪"02.08.91 TT GetFileName kopiert _Rest_ vom Namen, falls er nicht paßt.⓪"27.10.91 TT SetDateTime löscht nun wirklich 'state' und nicht irgendein⓪0Word irgendwo im Speicher.⓪"10.12.93 TT Create (.. appendSeqTxt, ..) nun auch unter MTOS möglich (ging⓪0nicht, weil Datei mit "readOnly" geöffnet wurde und nur das⓪0alte TOS dies nicht bemängelt hatte).⓪ *)⓪ ⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, LONGWORD, ADR, WORD, TSIZE;⓪ ⓪ FROM SysTypes IMPORT ScanDesc;⓪ ⓪ FROM SysCtrl IMPORT GetScanAddr, ScanBack;⓪ ⓪ FROM Clock IMPORT Time, Date, PackTime, PackDate, UnpackTime, UnpackDate,⓪(CurrentTime, CurrentDate;⓪ ⓪ FROM Strings IMPORT Upper, Length, Copy, Assign, Pos, Delete, Insert, StrEqual;⓪ ⓪ FROM Storage IMPORT SysAlloc, DEALLOCATE;⓪ ⓪ FROM ResCtrl IMPORT RemovalCarrier, CatchRemoval;⓪ ⓪ FROM FileBase IMPORT CloseFile, HandleError, Unit, UnitDriver,⓪(UDriver, UDataProc, UCloseProc, UFlushProc, URStrProc,⓪(UWStrProc, UGChrProc;⓪ ⓪ FROM MOSConfig IMPORT FileErrMsg;⓪ ⓪ FROM MOSGlobals IMPORT fFileNotOpen, fInternalErr1, fWasNotOpen, fOutOfMem,⓪(fFileExists, fNoReadAllowed, fNameTooLarge, fBadOp, fBadAccess,⓪(fFileNotClosed, MemArea;⓪ ⓪ FROM PrgCtrl IMPORT TermCarrier, CatchProcessTerm, EnvlpCarrier, SetEnvelope;⓪ ⓪ FROM StrConv IMPORT IntToStr;⓪ ⓪ (*$I FileDesc.Icl *)⓪ ⓪ CONST BufferSize = 512; (* Größe f. Daten-Puffer bei 'readSeqTxt' *)⓪ ⓪ (*$O+*)⓪ TYPE File = POINTER TO FileDesc;⓪ (*$O-*)⓪ ⓪%FileList = POINTER TO FileField;⓪%FileField = RECORD⓪3next: FileList;⓪3owner: File;⓪3marked: BOOLEAN;⓪1END;⓪ ⓪ TYPE seekMode = ( fromBegin, fromPos, fromEnd );⓪ ⓪ CONST MaxWarn = 4;⓪&MaxErrorNo = -142;⓪ ⓪ VAR ErrorTable: ARRAY [MaxErrorNo..MaxWarn] OF INTEGER;⓪$ErrTblEnd, ErrTblBeg: ADDRESS;⓪$OpenFiles: FileList;⓪$ModLevel: INTEGER;⓪$strRes: BOOLEAN;⓪$unitSize: CARDINAL;⓪$fileSize: LONGCARD;⓪ ⓪ ⓪ PROCEDURE Init (VAR f: File);⓪"BEGIN⓪$f:= NIL⓪"END Init;⓪ ⓪ ⓪ PROCEDURE Abort (VAR f: File);⓪"BEGIN⓪$HALT⓪"END Abort;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE OpErr (n:LONGWORD):File;⓪"BEGIN⓪$ASSEMBLER⓪(MOVEQ #MaxWarn,D0⓪(SUB.L -(A3),D0⓪(LSL.L #1,D0⓪(ADD.L ErrTblBeg,D0⓪(MOVE.L D0,(A3)+⓪$END⓪"END OpErr;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE seek (offset : LONGINT; handle: INTEGER; base: seekMode):LONGINT;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L -(A3),-(A7)⓪(MOVE #$42,-(A7)⓪(TRAP #1⓪(ADDA.W #10,A7⓪(MOVE.L D0,(A3)+⓪$END⓪"END seek;⓪ (*$L+*)⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE del (VAR name: ARRAY OF CHAR);⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L #2,A3⓪(MOVE.L -(A3),-(A7)⓪(MOVE #$41,-(A7) ; DELETE⓪(TRAP #1⓪(ADDQ.L #6,A7⓪$END;⓪"END del;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE clos (h: WORD): LONGINT;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE -(A3),-(A7)⓪(MOVE #$3E,-(A7) ; CLOSE⓪(TRAP #1⓪(ADDQ.L #4,A7⓪(MOVE.L D0,(A3)+⓪$END⓪"END clos;⓪ ⓪ (*$L-*)⓪ PROCEDURE LowerWord (l:LONGWORD):WORD;⓪"BEGIN⓪$ASSEMBLER⓪&MOVE.L -(A3),D0⓪&MOVE D0,(A3)+⓪$END⓪"END LowerWord;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE Opened (f: File): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(; A1, D2 nicht zerstören !⓪(MOVE.L -(A3),D0⓪(BEQ FA⓪(MOVE.L OpenFiles,A0⓪%L0 MOVE.L A0,D1⓪(BEQ FA⓪(CMP.L FileField.owner(A0),D0⓪(BEQ TR⓪(MOVE.L FileField.next(A0),A0⓪(BRA L0⓪%TR MOVE #1,(A3)+⓪(RTS⓪%FA CLR (A3)+⓪$END⓪"END Opened;⓪ ⓪ (*$L-*)⓪ PROCEDURE ListAppend (f:File; VAR res: LONGINT): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -8(A3),(A3)+⓪(JSR Opened⓪(TST -(A3)⓪(BEQ T0⓪%EE MOVE #fFileNotClosed,D0⓪(MOVE.L -(A3),A0⓪(SUBQ.L #4,A0⓪(MOVE D0,File.state(A0)⓪(CLR (A3)+⓪(RTS⓪%T0 LEA OpenFiles,A0⓪(MOVE.L (A0),-(A7)⓪(MOVE.L A0,(A3)+⓪(MOVE.L fileSize,(A3)+⓪(JSR SysAlloc⓪(MOVE.L (A7)+,D0⓪(LEA OpenFiles,A0⓪(MOVE.L (A0),D1⓪(BNE T1⓪(MOVE.L D0,(A0)⓪(MOVE #fOutOfMem,D0⓪(BRA EE⓪%T1 MOVE.L D1,A1⓪(MOVE.L D0,FileField.next(A1)⓪(SUBQ.L #4,A3⓪(MOVE.L -(A3),FileField.owner(A1)⓪(MOVE #1,(A3)+⓪$END⓪"END ListAppend;⓪ ⓪ (*$L-*)⓪ PROCEDURE ListRemove (VAR f: File);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),A0 ; ^FILE⓪(MOVE.L (A0),D0⓪(LEA OpenFiles,A1⓪%L0 MOVE.L (A1),A2⓪(MOVE.L A2,D2⓪(BEQ E0⓪(CMP.L FileField.owner(A2),D0⓪(BNE T0⓪(MOVE.L FileField.next(A2),(A1)⓪(MOVE.L A2,-(A7)⓪(MOVE.L A7,(A3)+⓪(CLR.L (A3)+⓪(JSR DEALLOCATE⓪(ADDQ.L #4,A7⓪(RTS⓪%T0 LEA FileField.next(A2),A1⓪(BRA L0⓪%E0 CLR.L (A0)⓪$END⓪"END ListRemove;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE free (VAR f:File; res:LONGINT);⓪"BEGIN⓪$ASSEMBLER⓪(JSR OpErr⓪(MOVE.L -(A3),-(A7) ; error-code⓪(MOVE.L -4(A3),-(A7) ; ADR (f)⓪(JSR ListRemove⓪(MOVE.L (A7),A0 ; ADR (f)⓪(MOVE.L (A0),A1⓪(MOVE.L File.buffer(A1),D0⓪(BEQ noBuf⓪(MOVE.L D0,-(A7)⓪(MOVE.L A7,(A3)+ ; f.buffer⓪(CLR.L (A3)+⓪(JSR DEALLOCATE⓪(ADDQ.L #4,A7⓪&noBuf⓪(MOVE.L (A7),(A3)+ ; ADR (f)⓪(CLR.L (A3)+⓪(JSR DEALLOCATE⓪(MOVE.L (A7)+,A0⓪(MOVE.L (A7)+,(A0)⓪$END⓪"END free;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE init0 (f: File);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),A0⓪(MOVEQ #0,D0⓪(MOVE.B D0,File.lastch(A0)⓪(MOVE.B D0,File.prevch(A0)⓪(MOVE.W D0,File.getlast(A0)⓪(MOVE.W D0,File.eof(A0)⓪(MOVE.W D0,File.eol(A0)⓪(MOVE.W D0,File.skipLF(A0)⓪(MOVE.W D0,File.state(A0)⓪(MOVE.W #1,File.chkeof(A0)⓪(MOVE.B #26,File.eofchr(A0)⓪$END⓪"END init0;⓪ ⓪ (*$L-*)⓪ PROCEDURE fileUpper (VAR s: ARRAY OF CHAR);⓪"(* "Upper" für Dateinamen: berücksichtigt nur die unteren 128 Zeichen *)⓪"VAR n: CARDINAL;⓪"BEGIN⓪$(*⓪$FOR n:= 0 TO HIGH (s) DO⓪&IF s[n]='' THEN RETURN END;⓪&IF s[n]<CHR(128) THEN s[n]:=CAP(s[n]) END⓪$END⓪$*)⓪$ASSEMBLER⓪(MOVE.W -(A3),D1⓪(MOVE.L -(A3),A1⓪(CLR.W D0⓪&luup:⓪(MOVE.B (A1)+,D0⓪(BEQ ende⓪(BMI next⓪(JSR @CAP ;/A2⓪(MOVE.B D0,-1(A1)⓪&next:⓪(DBRA D1,luup⓪&ende:⓪$END⓪"END fileUpper;⓪ ⓪ (*$L+*)⓪ PROCEDURE prepErr (VAR f:File; REF n: ARRAY OF CHAR; VAR myname: ARRAY OF CHAR;⓪3mode:Access; VAR unit0:Unit; VAR disk: BOOLEAN ): BOOLEAN;⓪"⓪"VAR res:LONGINT;⓪"⓪"PROCEDURE checkUnit;⓪$VAR s: ARRAY [0..39] OF CHAR;⓪(ok:BOOLEAN;⓪(unitIdx: Unit;⓪$BEGIN⓪&res:=0L;⓪&FOR unitIdx:= con TO ext7 DO⓪(WITH UnitDriver [unitIdx] DO⓪*Copy (myname,0,Length(name),s,ok);⓪*IF valid & StrEqual (s,name) THEN⓪,IF ORD (mode) < 3 THEN⓪.res := fBadOp⓪,ELSIF ((mode#readSeqTxt) & ~output) OR ((mode=readSeqTxt) & ~input) THEN⓪.res := fBadAccess⓪,END;⓪,disk:= FALSE;⓪,unit0:= unitIdx;⓪,RETURN⓪*END⓪(END⓪&END;⓪&disk:= TRUE⓪$END checkUnit;⓪"⓪"BEGIN⓪$Assign (n,myname,strRes);⓪$IF NOT strRes THEN⓪&f:= OpErr (LONG(fNameTooLarge));⓪&RETURN TRUE⓪$END;⓪$fileUpper (myname);⓪$SysAlloc (f, TSIZE (FileDesc));⓪$IF f=NIL THEN⓪&f := OpErr (LONG(fOutOfMem));⓪&RETURN TRUE⓪$END;⓪$f^.buffer:= NIL;⓪$IF ~ListAppend (f,res) THEN⓪&DEALLOCATE (f,0L);⓪&f := OpErr (res);⓪&RETURN TRUE⓪$END;⓪$checkUnit;⓪$IF res<0L THEN⓪&free (f,res);⓪&RETURN TRUE⓪$END;⓪$Assign (myname,f^.name,strRes);⓪$RETURN FALSE⓪"END prepErr;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE unitOpen (VAR f:File; unit0:Unit): BOOLEAN;⓪"VAR res:INTEGER;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE unit0(A6),D0⓪(MULU unitSize,D0⓪(LEA UnitDriver,A0⓪(ADDA.W D0,A0⓪(MOVE.L f(A6),A1⓪(MOVE.L (A1),A1⓪(MOVE.L UDriver.wrData(A0),File.uwrite(A1)⓪(MOVE.L UDriver.wrStr(A0),File.uwrstr(A1)⓪(MOVE.L UDriver.rdData(A0),File.uread(A1)⓪(MOVE.L UDriver.rdChr(A0),File.urdchr(A1)⓪(MOVE.W UDriver.console(A0),File.ucons(A1)⓪(MOVE.L UDriver.close(A0),File.uclose(A1)⓪(MOVE.L UDriver.flush(A0),File.uflush(A1)⓪(MOVE.L UDriver.initHdl(A0),File.uhandle(A1)⓪$END;⓪$WITH f^ DO⓪&unit:= unit0;⓪&res:= UnitDriver[unit].open (uhandle,name); (* 'name' ist auch in Unit *)⓪$END;⓪$IF res<0 THEN⓪&free (f,LONG(res));⓪&RETURN TRUE⓪$ELSE⓪&RETURN FALSE⓪$END⓪"END unitOpen;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE open0 (VAR f : File;⓪5REF mediumname: ARRAY OF CHAR;⓪5mode : Access;⓪5level : INTEGER);⓪"VAR h, n: CARDINAL;⓪&l, res: LONGINT;⓪&myname: ARRAY [0..139] OF CHAR;⓪&append, disk: BOOLEAN;⓪&unit0: Unit;⓪"BEGIN⓪$res:= 0;⓪$IF prepErr (f,mediumname,myname,mode,unit0,disk) THEN RETURN END;⓪$append:= FALSE;⓪$IF disk THEN⓪&ASSEMBLER⓪(MOVE mode(A6),D0⓪(CMPI #2,D0⓪(BLS ok⓪(SUBQ #3,D0⓪(CMPI #2,D0 ; appendSeqTxt ?⓪(BNE ok⓪(MOVEQ #1,D0 ; writeOnly⓪$ok: MOVE D0,-(A7)⓪(PEA myname(A6)⓪(MOVE #$3D,-(A7) ; OPEN⓪(TRAP #1⓪(ADDQ.L #8,A7⓪(MOVE.L D0,res(A6)⓪&END;⓪&IF res < 0L THEN⓪(free (f,res);⓪(RETURN⓪&ELSE⓪(IF mode=readSeqTxt THEN⓪*f^.bufsize:= BufferSize;⓪*f^.bufpos:= BufferSize;⓪*SysAlloc (f^.buffer, BufferSize);⓪*IF f^.buffer = NIL THEN⓪,res:= clos (h);⓪,free (f,fOutOfMem);⓪,RETURN⓪*END⓪(END;⓪(h:= SHORT (res);⓪(l:= seek (0L,h,fromEnd);⓪(IF mode=appendSeqTxt THEN⓪*append:= TRUE⓪(ELSE⓪*res:= seek (0L,h,fromBegin)⓪(END;⓪(IF (l<0L) OR (res<0L) THEN⓪*IF l>=0L THEN l:= res END;⓪*res:= clos (h);⓪*free (f,l);⓪*RETURN⓪(END⓪&END⓪$ELSE⓪&IF unitOpen (f,unit0) THEN RETURN END;⓪&l:= 0⓪$END;⓪$WITH f^ DO⓪&ondisk:= disk;⓪&IF ondisk THEN⓪(new:= FALSE;⓪(handle:= h;⓪(modified:= FALSE;⓪&END;⓪&accmode := mode;⓪&IF append THEN pos := l ELSE pos := 0 END;⓪&len := l;⓪&modlevel := level⓪$END;⓪$init0 (f)⓪"END open0;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE create0 (VAR f : File;⓪7REF mediumname: ARRAY OF CHAR;⓪7mode : Access;⓪7replMode : ReplaceMode;⓪7level : INTEGER);⓪"VAR h, n: CARDINAL;⓪&res: LONGINT;⓪&myname: ARRAY [0..139] OF CHAR;⓪&append, disk: BOOLEAN;⓪&unit0: Unit;⓪"BEGIN⓪$res := 0;⓪$IF (mode=readOnly) OR (mode=readSeqTxt) THEN⓪&f:= OpErr (LONG(fNoReadAllowed));⓪&RETURN⓪$END;⓪$IF prepErr (f,mediumname,myname,mode,unit0,disk) THEN RETURN END;⓪$append := FALSE;⓪$IF disk THEN⓪&ASSEMBLER⓪*MOVE #writeOnly,-(A7)⓪*PEA myname(A6)⓪*MOVE #$3D,-(A7) ; OPEN⓪*TRAP #1⓪*ADDQ.L #8,A7⓪*MOVE.L D0,res(A6)⓪&END;⓪&IF res>=0L THEN (* Datei existiert *)⓪(IF replMode = noReplace THEN⓪*res := clos (LowerWord(res));⓪*free (f,LONG(fFileExists));⓪*RETURN⓪(ELSE⓪*IF mode#appendSeqTxt THEN⓪,res := clos (LowerWord(res));⓪,del (myname);⓪,res := -33⓪*ELSE⓪,append := TRUE⓪*END⓪(END⓪&END;⓪&IF (res=-33L) OR (res=-34L) THEN⓪(ASSEMBLER⓪*CLR -(A7)⓪*PEA myname(A6)⓪*MOVE #$3C,-(A7) ; CREATE⓪*TRAP #1⓪*ADDQ.L #8,A7⓪*MOVE.L D0,res(A6)⓪(END⓪&END;⓪&IF res < 0L THEN⓪(free (f,res);⓪(RETURN⓪&END;⓪&h := SHORT (res)⓪$ELSE⓪&IF unitOpen (f,unit0) THEN RETURN END;⓪$END;⓪$WITH f^ DO⓪&ondisk:= disk;⓪&IF ondisk THEN⓪(new:= TRUE;⓪(handle:= h;⓪(modified:= FALSE;⓪&END;⓪&accmode := mode;⓪&IF append THEN⓪(res := seek (0,h,fromEnd);⓪(IF res < 0L THEN⓪*free (f,res);⓪*RETURN⓪(END;⓪(len := res;⓪(pos := res⓪&ELSE⓪(len := 0;⓪(pos := 0;⓪&END;⓪&modlevel := level⓪$END;⓪$init0 (f)⓪"END create0;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE Open (VAR f: File; REF n: ARRAY OF CHAR; m: Access);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W ModLevel,(A3)+⓪(JMP open0⓪$END⓪"END Open;⓪ ⓪ (*$L-*)⓪ PROCEDURE SysOpen (VAR f: File; REF n: ARRAY OF CHAR; m: Access);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #-1,(A3)+⓪(JMP open0⓪$END⓪"END SysOpen;⓪ ⓪ (*$L-*)⓪ PROCEDURE Create (VAR f: File; REF n: ARRAY OF CHAR; m: Access; r: ReplaceMode);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W ModLevel,(A3)+⓪(JMP create0⓪$END⓪"END Create;⓪ ⓪ (*$L-*)⓪ PROCEDURE SysCreate (VAR f: File; REF n: ARRAY OF CHAR; m: Access; r: ReplaceMode);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #-1,(A3)+⓪(JMP create0⓪$END⓪"END SysCreate;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE clRem;⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE D0,-(A7)⓪(MOVE.L -(A3),A0⓪(MOVE.L A0,-(A7)⓪(MOVE.L (A0),(A3)+⓪(JSR Opened⓪(TST -(A3)⓪(BEQ.W OE⓪(MOVE.L (A7),A0⓪(MOVE.L (A0),(A3)+⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ.W E0⓪(MOVE.L (A7),(A3)+⓪(JSR ListRemove⓪(MOVE.L (A7),A0⓪(MOVE.L (A0),A1⓪(MOVE.L A1,D1⓪(BEQ.W E0⓪(TST File.ondisk(A1)⓪(BEQ T0⓪(⓪(; Wenn Close() und Datei nicht neu angelegt, Datum ggf. neu setzen⓪(MOVE 4(A7),D0 ; Remove()?⓪(OR File.new(A1),D0 ; oder Datei neu angelegt?⓪(BNE T1⓪(⓪(TST.W File.modified(A1) ; Datei beschrieben?⓪(BEQ T1⓪(⓪(; Datum setzen⓪(MOVE.L A1,(A3)+ ; f⓪(JSR CurrentDate⓪(JSR CurrentTime⓪(JSR SetDateTime⓪(⓪%T1 ; File beim GEMDOS schließen⓪(MOVE.L (A7),A0⓪(MOVE.L (A0),A1⓪(MOVE File.handle(A1),(A3)+⓪(MOVE.L A1,-(A7)⓪(JSR clos ; liefert state.L auf Heap⓪(MOVE.L (A7)+,A1⓪(⓪(; Wenn Remove() und Datei neu angelegt, Datei löschen⓪(MOVE 4(A7),D0 ; Remove()?⓪(AND File.new(A1),D0 ; und Datei neu angelegt?⓪(BEQ T2⓪(⓪(; Datei löschen⓪(CLR.L -4(A3)⓪(LEA File.name(A1),A0⓪(MOVE.L A0,(A3)+⓪(ADDQ.L #2,A3⓪(JSR del⓪(BRA T2⓪(⓪%T0 MOVE.L File.uhandle(A1),(A3)+⓪(MOVE.L File.uclose(A1),A2⓪(JSR (A2)⓪(MOVE.W -(A3),D0⓪(EXT.L D0⓪(MOVE.L D0,(A3)+⓪(⓪%T2 MOVE.L (A7),A0 ; ADR (f)⓪(MOVE.L (A0),A1⓪(MOVE.L File.buffer(A1),D0⓪(BEQ noBuf⓪(MOVE.L D0,-(A7)⓪(MOVE.L A7,(A3)+ ; f.buffer⓪(CLR.L (A3)+⓪(JSR DEALLOCATE⓪(ADDQ.L #4,A7⓪%noBuf⓪(MOVE.L (A7),(A3)+⓪(CLR.L (A3)+⓪(JSR DEALLOCATE⓪(BRA E1⓪%E0 MOVE.L (A7)+,A0⓪(CLR.L (A0)⓪(UNLK A5⓪(RTS⓪%OE MOVE.L #fWasNotOpen,(A3)+⓪%E1 JSR OpErr⓪(MOVE.L (A7)+,A0⓪(MOVE.L -(A3),(A0)⓪(UNLK A5⓪$END⓪"END clRem;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE Close (VAR f: File);⓪"BEGIN⓪$ASSEMBLER⓪(MOVEQ #0,D0 ; REMOVE nicht möglich⓪(JMP clRem⓪$END⓪"END Close;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE Remove (VAR f: File);⓪"BEGIN⓪$ASSEMBLER⓪(MOVEQ #1,D0 ; REMOVE möglich⓪(JMP clRem⓪$END⓪"END Remove;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE EOF (f: File): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(; zerstört nur D0/A0, in A0 zuletzt immer File !⓪(MOVE.L -(A3),D0⓪(MOVE.L D0,A0⓪(BEQ TR⓪(TST File.state(A0)⓪(BMI TR⓪(CMPI #3,File.accmode(A0)⓪(BCC T0⓪(MOVE.L File.pos(A0),D0⓪(CMP.L File.len(A0),D0⓪(SCC D0⓪(ANDI #1,D0⓪(MOVE D0,(A3)+⓪(RTS⓪%T0 MOVE File.eof(A0),(A3)+⓪(RTS⓪%TR MOVE #1,(A3)+⓪$END⓪"END EOF;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE State (f: File): INTEGER;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),D0⓪(BEQ ER⓪(MOVE.L D0,A0⓪(MOVE File.state(A0),(A3)+⓪(RTS⓪%ER MOVE #fFileNotOpen,(A3)+⓪$END⓪"END State;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE getSt2 (ad:ADDRESS; n:INTEGER; VAR msg:ARRAY OF CHAR): BOOLEAN;⓪"VAR s: POINTER TO ARRAY [0..31] OF CHAR;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L ad(A6),A0⓪(MOVE.W n(A6),D0⓪(⓪%l: CMP.W (A0)+,D0⓪(BNE c⓪(⓪(; gefunden⓪(MOVE.L A0,s(A6)⓪(BRA e⓪(⓪%c: TST.B (A0) ; Listenende ?⓪(BEQ f ; Ja, -> nicht gefunden⓪(⓪%m: ADDA.W #32,A0⓪(BRA l⓪(⓪%f: CLR.L s(A6)⓪%e:⓪$END;⓪$IF s#NIL THEN⓪&Assign (s^,msg,strRes);⓪&RETURN TRUE⓪$ELSE⓪&RETURN FALSE⓪$END⓪"END getSt2;⓪ ⓪ (*$L+*)⓪ PROCEDURE GetStateMsg (n: INTEGER; VAR msg: ARRAY OF CHAR);⓪"VAR p:INTEGER;⓪"BEGIN⓪$msg[0]:=0C;⓪$IF FileErrMsg=NIL THEN⓪&Assign ('Unknown error #@',msg,strRes)⓪$ELSE⓪&IF ~getSt2 (FileErrMsg,n,msg) THEN⓪(IF n<0 THEN⓪*IF getSt2 (FileErrMsg,-32768,msg) THEN END⓪(ELSE⓪*IF getSt2 (FileErrMsg,32767,msg) THEN END⓪(END⓪&END;⓪$END;⓪$p:=Pos ('@',msg,0);⓪$IF p>=0 THEN⓪&Delete (msg,p,1,strRes);⓪&Insert (IntToStr(n,0),p,msg,strRes)⓪$END⓪"END GetStateMsg;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE ResetState (VAR f: File);⓪"VAR r: LONGINT;⓪"BEGIN⓪$IF Opened (f) THEN⓪&WITH f^ DO⓪(state := 0;⓪(IF ondisk THEN⓪*r := seek (0L,handle,fromPos);⓪*IF r<0L THEN⓪,state := SHORT (r)⓪*ELSE⓪,pos := r;⓪,r := seek (0L,handle,fromEnd);⓪,IF r<0L THEN⓪.state := SHORT (r)⓪,ELSE⓪.len := r⓪,END⓪*END⓪(END⓪&END⓪$ELSE⓪&f := NIL⓪$END⓪"END ResetState;⓪ ⓪ (*$L-*)⓪ PROCEDURE InErrField (f:ADDRESS):BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(; A0, A1, D1, D2 nicht zerstören !⓪(MOVE.L -(A3),D0⓪(CMP.L ErrTblBeg,D0⓪(BCS FA⓪(CMP.L ErrTblEnd,D0⓪(BCC FA⓪(MOVE #1,(A3)+⓪(RTS⓪%FA CLR (A3)+⓪$END⓪"END InErrField;⓪ ⓪ (*$L-*)⓪ PROCEDURE @CheckState (f: File): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(; Am Ende immer File in A0 ! -- A1 nicht zerstören !⓪(MOVE.L -(A3),D0⓪(BEQ T6 ; -> file not open⓪(MOVE.L D0,A0⓪(CMP.L ErrTblBeg,D0⓪(BCS T1⓪(CMP.L ErrTblEnd,D0⓪(BCS T5⓪%T1 ; 'f' ist nicht im ErrField⓪(TST File.ondisk(A0)⓪(BEQ T2⓪(MOVE.L File.pos(A0),D0⓪(CMP.L File.len(A0),D0⓪(BLS T2⓪(MOVE #fInternalErr1,D2⓪(BRA T3⓪%T2 MOVE File.state(A0),D2⓪(BMI T3⓪(MOVE #1,(A3)+⓪(RTS⓪%T5 ; 'f' ist im ErrField⓪(MOVE (A0),D2⓪(BMI T4⓪(BRA T6⓪%T3 MOVE.L A0,(A3)+⓪(MOVEM.L D1/A0,-(A7)⓪(JSR Opened⓪(MOVEM.L (A7)+,D1/A0⓪(TST -(A3)⓪(BNE T4⓪(MOVE.L A0,(A3)+⓪(JSR InErrField⓪(TST -(A3)⓪(BNE T4⓪%T6 MOVE #fFileNotOpen,D2⓪%T4 LINK A5,#0⓪(MOVEM.L D1/A0/A1,-(A7)⓪(MOVE.L A0,-(A7)⓪(SUBA.W #TSIZE (ScanDesc),A7⓪(MOVE.L A7,(A3)+⓪(MOVE D2,-(A7)⓪(JSR GetScanAddr⓪(LEA 2(A7),A0⓪(MOVE.L A0,(A3)+⓪(JSR ScanBack⓪(SUBQ.L #2,A3⓪(LEA 14(A7),A0⓪(MOVE.L A0,(A3)+ ; VAR File⓪(MOVE (A7)+,(A3)+ ; err-no⓪(MOVE.L (A7)+,(A3)+ ; ScanDesc⓪(MOVE.L (A7)+,(A3)+ ; ScanDesc⓪(MOVE.L (A7)+,(A3)+ ; ScanDesc⓪(MOVE.L HandleError,A0⓪(JSR (A0)⓪(ADDQ.L #4,A7⓪(MOVE.L 4(A7),(A3)+⓪(JSR Opened⓪(MOVEM.L (A7)+,D1/A0/A1⓪(UNLK A5⓪$END⓪"END @CheckState;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE AccessMode (f: File): Access;⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JSR @CheckState⓪(CLR D0⓪(TST -(A3)⓪(BEQ E0⓪(MOVE File.accmode(A0),D0⓪%E0 MOVE D0,(A3)+⓪(UNLK A5⓪$END⓪"END AccessMode;⓪ ⓪ (*$L-*)⓪ PROCEDURE DiskAccess (f: File): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JSR @CheckState⓪(CLR D0⓪(TST -(A3)⓪(BEQ E0⓪(MOVE File.ondisk(A0),D0⓪%E0 MOVE D0,(A3)+⓪(UNLK A5⓪$END⓪"END DiskAccess;⓪ ⓪ (*$L-*)⓪ PROCEDURE SetEOFMode (f: File; checkChar: BOOLEAN; eofChar: CHAR);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -8(A3),(A3)+⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ E0⓪(SUBQ.L #1,A3⓪(MOVE.B -(A3),D0⓪(MOVE.W -(A3),D1⓪(MOVE.L -(A3),A0⓪(CMPI #readSeqTxt,File.accmode(A0)⓪(BEQ T0⓪(MOVE #fBadOp,File.state(A0)⓪(MOVE.L A0,(A3)+⓪(JSR @CheckState⓪(SUBQ.L #2,A3⓪(CLR.W File.state(A0)⓪(UNLK A5⓪(RTS⓪%T0 MOVE.B D0,File.eofchr(A0)⓪(MOVE.W D1,File.chkeof(A0)⓪(CLR File.eof(A0)⓪(UNLK A5⓪(RTS⓪%E0 SUBQ.L #8,A3⓪(UNLK A5⓪$END⓪"END SetEOFMode;⓪ ⓪ (*$L-*)⓪ PROCEDURE GetEOFMode (f: File; VAR checkChar: BOOLEAN; VAR eofChar: CHAR);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -12(A3),(A3)+⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ E0⓪(SUBQ.L #1,A3⓪(MOVE.L -(A3),A1⓪(MOVE.L -(A3),A2⓪(MOVE.L -(A3),A0⓪(CMPI #readSeqTxt,File.accmode(A0)⓪(BEQ T0⓪(MOVE #fBadOp,File.state(A0)⓪(MOVE.L A0,(A3)+⓪(JSR @CheckState⓪(SUBQ.L #2,A3⓪(CLR.W File.state(A0)⓪(UNLK A5⓪(RTS⓪%T0 MOVE.B File.eofchr(A0),(A1)⓪(MOVE.W File.chkeof(A0),(A2)⓪(UNLK A5⓪(RTS⓪%E0 SUBA.W #12,A3⓪(UNLK A5⓪$END⓪"END GetEOFMode;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE Flush (f: File);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ E0⓪(TST File.ondisk(A0)⓪(BNE ok⓪(MOVE.L File.uhandle(A0),(A3)+⓪(MOVE.L File.uflush(A0),A1⓪(MOVE.L A0,-(A7)⓪(JSR (A1)⓪(MOVE.L (A7)+,A0⓪(MOVE -(A3),File.state(A0)⓪(UNLK A5⓪(RTS⓪%ok CLR File.state(A0)⓪(UNLK A5⓪%E0⓪$END⓪"END Flush;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE SetDateTime ( f: File; d: Date; t: Time );⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JSR PackTime⓪(SUBQ #4,A7⓪(MOVE -(A3),(A7)⓪(JSR PackDate⓪(MOVE -(A3),2(A7)⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ ende⓪(TST.W File.ondisk(A0)⓪(BEQ ende⓪(CLR.W File.modified(A0) ; damit Datum nicht bei Close⓪(MOVE.L A0,-(A7) ; nochmal gesetzt wird⓪(MOVE #1,-(A7)⓪(MOVE File.handle(A0),-(A7)⓪(PEA 8(A7)⓪(MOVE #$57,-(A7)⓪(TRAP #1⓪(ADDA.W #10,A7⓪ ⓪ (* TOS 1.0 & 1.2 liefern keinen Fehler⓪(MOVEQ #0,D1⓪(TST.L D0⓪(BEQ C⓪(MOVE D0,D1⓪%C: MOVE D1,(A0) ; state⓪ *)⓪(MOVE.L (A7)+, A0 ; !MS⓪(CLR (A0) ; -> state immer auf Null setzen⓪%ende:⓪(UNLK A5⓪$END⓪"END SetDateTime;⓪ ⓪ (*$L-*)⓪ PROCEDURE GetDateTime ( f: File; VAR d: Date; VAR t: Time );⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -12(A3),(A3)+⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ error⓪(CLR.L -(A7)⓪(CLR -(A7)⓪(MOVE File.handle(A0),-(A7)⓪(PEA 4(A7)⓪(MOVE #$57,-(A7)⓪(TRAP #1⓪(ADDA.W #10,A7⓪ ⓪ (* TOS 1.0 & 1.2 liefern keinen Fehler⓪(MOVEQ #0,D1⓪(TST.L D0⓪(BEQ C⓪(MOVE D0,D1⓪%C: MOVE.L -12(A3),A0⓪(MOVE D1,(A0) ; state⓪ *)⓪(MOVE.L -12(A3),A0⓪(CLR (A0) ; -> state immer auf Null setzen⓪ ⓪(MOVE (A7)+,(A3)+ ; Time⓪(JSR UnpackTime⓪(MOVE.L -(A3),D0⓪(MOVE.W -(A3),D1⓪(MOVE.L -(A3),A0⓪(MOVE.W D1,(A0)+⓪(MOVE.L D0,(A0)⓪(⓪(MOVE (A7)+,(A3)+ ; Date⓪(JSR UnpackDate⓪(MOVE.L -(A3),D0⓪(MOVE.W -(A3),D1⓪(MOVE.L -(A3),A0⓪(MOVE.W D1,(A0)+⓪(MOVE.L D0,(A0)⓪(⓪(SUBQ.L #4,A3⓪(UNLK A5⓪(RTS⓪ ⓪%err2:⓪(⓪%error:⓪(MOVE.L -(A3),A0 ; time⓪(CLR.W (A0)+⓪(CLR.L (A0)⓪(MOVE.L -(A3),A0 ; date⓪(MOVE.W #31,Date.day(A0)⓪(MOVE.W #12,Date.month(A0)⓪(MOVE.W #2099,Date.year(A0)⓪(SUBQ.L #4,A3 ; f⓪(UNLK A5⓪$END⓪"END GetDateTime;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE GetFileName (f: File; VAR name: ARRAY OF CHAR);⓪"BEGIN⓪$IF Opened (f) THEN⓪&Assign (f^.name,name,strRes);⓪&IF ~strRes THEN⓪(Copy (f^.name,LENGTH(f^.name)-(HIGH(name)+1),HIGH(name)+1,name,strRes);⓪(IF HIGH (name) > 2 THEN⓪*name[0]:= '.';⓪*name[1]:= '.';⓪(END⓪&END⓪$ELSE⓪&ASSEMBLER⓪(MOVE.L name(A6),A0⓪(CLR.B (A0)⓪&END⓪$END⓪"END GetFileName;⓪ ⓪ ⓪ (*$L+*)⓪ PROCEDURE releaseLevel;⓪"VAR called: BOOLEAN;⓪&p2: FileList;⓪&f:File;⓪"BEGIN⓪$p2:= OpenFiles;⓪$WHILE p2 # NIL DO⓪&p2^.marked:= FALSE;⓪&p2:= p2^.next⓪$END;⓪$REPEAT⓪&p2:= OpenFiles;⓪&called:= FALSE;⓪&WHILE p2 # NIL DO⓪(IF ~p2^.marked & (p2^.owner^.modlevel >= ModLevel) THEN⓪*WITH p2^ DO⓪,marked:= TRUE;⓪,owner^.state:=0;⓪,CloseFile (owner,owner^.ondisk & owner^.new);⓪,IF Opened (owner) THEN⓪.owner^.state:= 0;⓪.f:= owner; (* wg. VAR-Para bei Close *)⓪.Close (f)⓪,END⓪*END;⓪*called:= TRUE;⓪*p2:= NIL⓪(ELSE⓪*p2:= p2^.next⓪(END⓪&END⓪$UNTIL ~called;⓪"END releaseLevel;⓪ ⓪ (*$L+*)⓪ PROCEDURE ChgLevel (start:BOOLEAN; inChild:BOOLEAN; VAR exitCode:INTEGER);⓪"BEGIN⓪$IF inChild THEN⓪&IF start THEN⓪(INC (ModLevel)⓪&ELSE⓪(releaseLevel;⓪(DEC (ModLevel)⓪&END⓪$END⓪"END ChgLevel;⓪ ⓪ (*$L+*)⓪ PROCEDURE freeSys;⓪"BEGIN⓪$ModLevel:= MinInt;⓪$releaseLevel⓪"END freeSys;⓪ ⓪ VAR p: ADDRESS;⓪$i: INTEGER;⓪$hdl: EnvlpCarrier;⓪$tHdl: TermCarrier;⓪$rHdl: RemovalCarrier;⓪$wsp: MemArea;⓪ ⓪ BEGIN⓪"fileSize:= TSIZE (FileField);⓪"unitSize:= SHORT (SIZE (UnitDriver[con]));⓪"OpenFiles:= NIL;⓪"ModLevel:= 0;⓪"ErrTblBeg:= ADR (ErrorTable);⓪"ErrTblEnd:= ErrTblBeg + SIZE (ErrorTable);⓪"p:= ErrTblBeg;⓪"FOR i:= -MaxWarn TO -MaxErrorNo DO⓪$p^ := WORD(-i);⓪$INC (p,2)⓪"END;⓪"SetEnvelope (hdl,ChgLevel,wsp);⓪"CatchProcessTerm (tHdl,releaseLevel,wsp);⓪"CatchRemoval (rHdl,freeSys,wsp);⓪ END Files.⓪ ə
- (* $0000584F$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$0000387D$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$00002812$FFFAD5B5$FFFAD5B5$FFFAD5B5$FFFAD5B5$000028F6Ç$00000564T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001C02$00001D94$00002B0B$00002A3D$000004ED$0000060B$0000055E$00000608$00000564$000004FF$FFEC668A$00000553$000004FC$00000553$000004FB$00002A95ñÇâ*)
-